package org.wechat4j.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;



/**
 * FFMpegUntil
 * <p>Title: FFMpeg工具类</p>
 * <p>Description: 本类封装FFMpeg对视频的操作</p>
 * <p>Date: 2010-7-14</p>
 * <p>Copyright: Copyright (c) 2010</p>
 * <p>Company: novel-supertv.com</p>
 * @author chenggong
 * @version 1.0
 */
public class FFMpegUtil {

    public static boolean isLinux =  System.getProperty("os.name").toLowerCase().indexOf("linux") >= 0;

    private int runtime = 0;
    private String ffmpegUri;//ffmpeg地址
    private String originFileUri; //视频源文件地址
    private enum FFMpegUtilStatus { Empty, CheckingFile, GettingRuntime };
    private FFMpegUtilStatus status = FFMpegUtilStatus.Empty;
    private String runTimeStr ="00:00";
    /**
     * 构造函数
     * @param ffmpegUri ffmpeg的全路径
     * 		如e:/ffmpeg/ffmpeg.exe 或 /root/ffmpeg/bin/ffmpeg
     * @param originFileUri 所操作视频文件的全路径
     * 		如e:/upload/temp/test.wmv
     */
    public FFMpegUtil( String ffmpegUri, String originFileUri ){
        this.ffmpegUri = ffmpegUri;
        this.originFileUri = originFileUri;
    }

    /**
     * 获取视频时长
     * @return
     */
    public String getRuntime(){
        runtime = 0;
        runTimeStr= "00:00";
        status = FFMpegUtilStatus.GettingRuntime;
        cmd.clear();
        cmd.add(ffmpegUri);
        cmd.add("-i");
        cmd.add(originFileUri);
        CmdExecuter.exec(cmd, this);
        //return runtime;
        return runTimeStr;
    }

    /**
     * 检测文件是否是支持的格式
     * 将检测视频文件本身，而不是扩展名
     * @return
     */
    public boolean isSupported(){
        isSupported = true;
        status = FFMpegUtilStatus.CheckingFile;
        cmd.clear();
        cmd.add(ffmpegUri);
        cmd.add("-i");
        cmd.add(originFileUri);
        CmdExecuter.exec(cmd, this);
        return isSupported;
    }

    private boolean isSupported;

    /**
     * 生成视频截图
     * @param imageSavePath 截图文件保存全路径
     * @param screenSize 截图大小 如640x480
     */
    public void makeScreenCut( String imageSavePath , String screenSize ){
        cmd.clear();
        cmd.add(ffmpegUri);
        cmd.add("-ss");
        cmd.add("00:00:00.000");
        cmd.add("-i");
        cmd.add(originFileUri);
        cmd.add("-y");
        cmd.add("-f");
        cmd.add("image2");
        //cmd.add("-ss");
        //cmd.add("8");
        cmd.add("-t");
        cmd.add("0.001");
        cmd.add("-s");
        cmd.add(screenSize);
        cmd.add(imageSavePath);
        CmdExecuter.exec(cmd, this);
    }

    /**
     * 视频转换
     * @param fileSavePath 文件保存全路径（包括扩展名）如 e:/abc/test.flv
     * @param screenSize 视频分辨率 如640x480
     * @param audioByte 音频比特率
     * @param audioCollection 音频采样率
     * @param quality 视频质量(0.01-255)越低质量越好
     * @param fps 每秒帧数（15或29.97）
     * %1\ffmpeg -i %2 -y -ab 56 -ar 22050 -b 500 -r 15 -s 320*240 %3
     */
    public void videoTransfer(
            String fileSavePath,
            String screenSize,
            int audioByte,
            int audioCollection,
            double quality,
            double fps ){
        cmd.clear();
        cmd.add(ffmpegUri);
        cmd.add("-i");
        cmd.add(originFileUri);
        cmd.add("-y");
        cmd.add("-ab");
        cmd.add( Integer.toString(audioByte) );
        cmd.add("-ar");
        cmd.add( Integer.toString(audioCollection) );
        cmd.add("-qscale");
        cmd.add( Double.toString(quality) );
        cmd.add("-r");
        cmd.add( Double.toString(fps) );
        cmd.add("-s");
        cmd.add(screenSize);
        cmd.add( fileSavePath );
        CmdExecuter.exec(cmd, this);
    }
    /**
     * 微信语音转码转换 amr -- > mp3
     * @param fileSavePath 文件保存全路径（包括扩展名）如 e:/abc/test.mp3
     */
    public void amr2mp3(
            String fileSavePath){
        cmd.clear();
        cmd.add(ffmpegUri);
        cmd.add("-i");
        cmd.add(originFileUri);
        cmd.add( fileSavePath );
        CmdExecuter.exec(cmd, this);
    }
    private List<String> cmd = new ArrayList<String>();

    public void dealString( String str ){

        switch( status )
        {
            case Empty:
                break;
            case CheckingFile:{
                Matcher m = Pattern.compile("Unknown format").matcher(str);
                if( m.find() )
                    this.isSupported = false;
                break;
            }
            case GettingRuntime:{
                Matcher m = Pattern.compile("Duration: //w+://w+://w+").matcher(str);
                while (m.find())
                {
                    String msg = m.group();
                    msg = msg.replace("Duration: ", "");
                    //runtime = TimeUtil.runtimeToSecond(msg);
                    runTimeStr = msg;
                }
                break;
            }
        }//switch
    }
    public static void main(String[] args) {

        String basePath ="C:\\Users\\Public\\Videos\\Sample Videos\\ffmpeg-20161110-863ebe6-win64-static\\bin\\";
        FFMpegUtil ffMpegUtil = new FFMpegUtil(basePath+"ffmpeg", "C:\\Users\\Public\\Videos\\Sample Videos\\VID_20150715_160019.mp4");
        //org.jeecgframework.core.util.LogUtil.info("时长："+ffMpegUtil.getRuntime());;
        //org.jeecgframework.core.util.LogUtil.info(ffMpegUtil.isSupported());
        ffMpegUtil.makeScreenCut("C:\\Users\\Public\\Videos\\Sample Videos\\1111222.jpg", "640x480");
        ffMpegUtil.videoTransfer("C:\\Users\\Public\\Videos\\Sample Videos\\b.flv",
                "640*480", 56, 22050, 200, 15);

    }
}
